package gui;

import jade.wrapper.ContainerController;
import jade.wrapper.StaleProxyException;

import java.awt.BorderLayout;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import componenti.statistica.Erlang;
import componenti.statistica.Esponenziale;
import componenti.statistica.Iperesponenziale;
import componenti.statistica.LeggeDistribuzione;
import componenti.statistica.Normale;

@SuppressWarnings("serial")
public class AnalisiStatistica extends JDialog {

	private JPanel centerPane;
	private JPanel southPane;
	private JPanel produttorePane;
	private JPanel consumatorePane;
	private JPanel sceltaAnalisiPane;
	private JButton ok;
	// private JLabel lotti;
	private JFormattedTextField nCampioni;
	private JFormattedTextField passoTx;
	private JFormattedTextField transitorioTx;
	private JFormattedTextField lottiTx;
	private LeggeDistribuzione leggeProduttore;
	private LeggeDistribuzione leggeConsumatore;
	// private MainFrame mf;
	private JComboBox comboMetodo;
	private JComboBox comboTipo;
	private int numeroOsservazioni;
	private int numeroReplicheLotti;
	private int passo;
	private int transitorio;
	private TipoAnalisi tAnalisi;
	private TipoRaggruppamento tRaggr;
	private ContainerController cc;

	public AnalisiStatistica(MainFrame mf, ContainerController cc) {
		super(mf);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setIconImage(Toolkit.getDefaultToolkit().getImage("img/statistica.png"));
		setLayout(new BorderLayout());
		setTitle("Analisi Statistica");
		// this.mf = mf;
		this.cc = cc;
		initCenterPanel();
		initSouthPanel();
		setModal(true);
		Point p = GraphicsEnvironment.getLocalGraphicsEnvironment()
				.getCenterPoint();
		setLocation(p.x - 300 / 2, p.y - 150);
		// setLocationByPlatform(true);
		// setLocationRelativeTo(mf);
		setResizable(false);
		pack();
		setVisible(true);

	}

	public enum TipoAnalisi {
		MEDIA {
			public String toString() {
				return "Media";
			}
		},
		DISTRIBUZIONE {
			public String toString() {
				return "Distribuzione";
			}
		},
		MEDIA_INCREMENTALE {
			public String toString() {
				return "Media Incrementale";
			}
		};
	}

	public enum TipoRaggruppamento {
		LOTTI {
			public String toString() {
				return "Metodo dei Batch";
			}
		},
		REPLICHE {
			public String toString() {
				return "Metodo delle repliche indipendenti";
			}
		};
	}

	private void initCenterPanel() {
		centerPane = new JPanel(new GridBagLayout());
		southPane = new JPanel(new GridBagLayout());
		sceltaAnalisiPane = new JPanel(new GridBagLayout());

		produttorePane = new PCPanel(PCPanel.PRODUTTORE);
		consumatorePane = new PCPanel(PCPanel.CONSUMATORE);

		Box boxProduttore = Box.createVerticalBox();
		boxProduttore.add(produttorePane);
		boxProduttore.setBorder(BorderFactory.createTitledBorder("Produttore"));

		Box boxConsumatore = Box.createVerticalBox();
		boxConsumatore.add(consumatorePane);
		boxConsumatore.setBorder(BorderFactory
				.createTitledBorder("Consumatore"));

		JLabel tipoLabel = new JLabel("Tipo analisi");
		JLabel metodoLabel = new JLabel("Metodo analisi");
		comboTipo = new JComboBox(TipoAnalisi.values());
		comboMetodo = new JComboBox(TipoRaggruppamento.values());

		// comboMetodo.addActionListener(new ActionListener() {
		//
		// @Override
		// public void actionPerformed(ActionEvent arg0) {
		// switch ((TipoRaggruppamento) comboMetodo.getSelectedItem()) {
		//
		// case LOTTI:
		// System.out.println("SONO LOTTI");
		// lotti=new JLabel("Lotti");
		// break;
		// case REPLICHE:
		// System.out.println("SONO REPLICHE");
		// lotti=new JLabel("Repliche");
		// break;
		// }
		//
		// pack();
		// }
		// });

		sceltaAnalisiPane.add(metodoLabel, new GridBagConstraints(0, 0, 1, 1,
				1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
				new Insets(10, 10, 5, 2), 0, 0));

		sceltaAnalisiPane.add(comboMetodo, new GridBagConstraints(1, 0, 1, 1,
				1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
				new Insets(10, 10, 5, 2), 0, 0));

		sceltaAnalisiPane.add(tipoLabel, new GridBagConstraints(0, 1, 1, 1,
				1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
				new Insets(10, 10, 5, 2), 0, 0));

		sceltaAnalisiPane.add(comboTipo, new GridBagConstraints(1, 1, 1, 1,
				1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
				new Insets(10, 10, 5, 2), 0, 0));

		Box sceltaAnalisiBox = Box.createVerticalBox();
		sceltaAnalisiBox.add(sceltaAnalisiPane);
		sceltaAnalisiBox.setBorder(BorderFactory
				.createTitledBorder("Scelta Analisi"));

		centerPane.add(boxProduttore, new GridBagConstraints(0, 0, 1, 1, 1.0,
				1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
				new Insets(10, 10, 5, 2), 0, 0));
		centerPane.add(boxConsumatore, new GridBagConstraints(1, 0, 1, 1, 1.0,
				1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
				new Insets(10, 10, 5, 2), 0, 0));
		centerPane.add(sceltaAnalisiBox, new GridBagConstraints(2, 0, 1, 1,
				1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
				new Insets(10, 10, 5, 2), 0, 0));

		ok = new JButton("Avvia");
		this.getRootPane().setDefaultButton(ok);
		ok.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// AVVIA IL MONDO

				if (nCampioni.getText().equals("")) {
					JOptionPane.showMessageDialog(AnalisiStatistica.this,
							"Inserisci il numero di osservazioni", "Errore",
							JOptionPane.ERROR_MESSAGE);
				} else if (transitorioTx.getText().equals("")) {
					JOptionPane.showMessageDialog(AnalisiStatistica.this,
							"Inserisci il valore del transitorio", "Errore",
							JOptionPane.ERROR_MESSAGE);
				} else if (passoTx.getText().equals("")) {
					JOptionPane.showMessageDialog(AnalisiStatistica.this,
							"Inserisci il valore del passo", "Errore",
							JOptionPane.ERROR_MESSAGE);
				} else if (lottiTx.getText().equals("")) {
					JOptionPane.showMessageDialog(AnalisiStatistica.this,
							"Inserisci il numero di repliche/lotti", "Errore",
							JOptionPane.ERROR_MESSAGE);
				} else {
					numeroOsservazioni = Integer.parseInt(nCampioni.getText());
					numeroReplicheLotti = Integer.parseInt(lottiTx.getText());
					passo = Integer.parseInt(passoTx.getText());
					transitorio = Integer.parseInt(transitorioTx.getText());
					if ((!(((numeroOsservazioni - transitorio) % numeroReplicheLotti) == 0))
							&& comboMetodo.getSelectedItem() == TipoRaggruppamento.LOTTI) {
						JOptionPane
								.showMessageDialog(
										AnalisiStatistica.this,
										"Il numero di lotti deve essere divisore intero del numero di osseravazioni meno il transitorio",
										"Errore", JOptionPane.ERROR_MESSAGE);
					} else if (numeroOsservazioni <= transitorio) {
						JOptionPane
								.showMessageDialog(
										AnalisiStatistica.this,
										"Il Valore del transitorio deve essere minore del numero di osservazioni",
										"Errore", JOptionPane.ERROR_MESSAGE);
					} else {
						// PRODUTTORE
						switch (((PCPanel) produttorePane).getSelection()) {
						case ESPONENZIALE:
							if (((PCPanel) produttorePane).getLambda() == -1) {
								break;
							}
							leggeProduttore = new Esponenziale(
									((PCPanel) produttorePane).getLambda());
							break;

						case ERLANG:
							if (((PCPanel) produttorePane).getLambda() == -1
									|| ((PCPanel) produttorePane)
											.getNumeroFunzioni() == -1) {
								break;
							}
							leggeProduttore = new Erlang(
									((PCPanel) produttorePane).getLambda(),
									((PCPanel) produttorePane)
											.getNumeroFunzioni());
							break;
						case IPERESPONENZIALE:
							if (((PCPanel) produttorePane).getFunzioni() == null) {
								break;
							}
							leggeProduttore = new Iperesponenziale();
							((Iperesponenziale) leggeProduttore)
									.setFunzioni(((PCPanel) produttorePane)
											.getFunzioni());
							break;
						case NORMALE:
							if (((PCPanel) produttorePane).getMedia() == -1
									|| ((PCPanel) produttorePane).getVarianza() == -1) {
								break;
							}
							leggeProduttore = new Normale(
									((PCPanel) produttorePane).getMedia(),
									((PCPanel) produttorePane).getVarianza());
							break;
						}

						// CONSUMATORE
						switch (((PCPanel) consumatorePane).getSelection()) {
						case ESPONENZIALE:
							if (((PCPanel) consumatorePane).getLambda() == -1) {
								break;
							}
							leggeConsumatore = new Esponenziale(
									((PCPanel) consumatorePane).getLambda());
							break;

						case ERLANG:
							if (((PCPanel) consumatorePane).getLambda() == -1
									|| ((PCPanel) consumatorePane)
											.getNumeroFunzioni() == -1) {
								break;
							}
							leggeConsumatore = new Erlang(
									((PCPanel) consumatorePane).getLambda(),
									((PCPanel) consumatorePane)
											.getNumeroFunzioni());
							break;
						case IPERESPONENZIALE:
							if (((PCPanel) consumatorePane).getFunzioni() == null) {
								break;
							}
							leggeConsumatore = new Iperesponenziale();
							((Iperesponenziale) leggeConsumatore)
									.setFunzioni(((PCPanel) consumatorePane)
											.getFunzioni());
							break;
						case NORMALE:
							if (((PCPanel) consumatorePane).getMedia() == -1
									|| ((PCPanel) consumatorePane)
											.getVarianza() == -1) {
								break;
							}
							leggeConsumatore = new Normale(
									((PCPanel) consumatorePane).getMedia(),
									((PCPanel) consumatorePane).getVarianza());
							break;
						}

						switch ((TipoAnalisi) comboTipo.getSelectedItem()) {
						case MEDIA:
							tAnalisi = TipoAnalisi.MEDIA;
							break;
						case DISTRIBUZIONE:
							tAnalisi = TipoAnalisi.DISTRIBUZIONE;
							break;
						case MEDIA_INCREMENTALE:
							tAnalisi = TipoAnalisi.MEDIA_INCREMENTALE;
							break;
						}

						switch ((TipoRaggruppamento) comboMetodo
								.getSelectedItem()) {
						case REPLICHE:
							tRaggr = TipoRaggruppamento.REPLICHE;
							break;
						case LOTTI:
							tRaggr = TipoRaggruppamento.LOTTI;
							break;

						}

						if (leggeConsumatore != null && leggeProduttore != null) {
							try {
								Object[] par = { numeroOsservazioni,
										leggeProduttore, leggeConsumatore,
										tRaggr, tAnalisi, transitorio, passo,
										numeroReplicheLotti };
								// System.out.println("NUM-OSSE: "
								// + numeroOsservazioni);
								// System.out.println("PROD: "
								// + leggeProduttore.getClass());
								// System.out.println("CONS: "
								// + leggeConsumatore.getClass());
								// System.out.println("RAGGRUPPAME: " + tRaggr);
								// System.out.println("ANALISI: " + tAnalisi);
								// System.out.println("TRANSITORIO: "
								// + transitorio);
								// System.out.println("PASSO: " + passo);
								// System.out.println("REPLICHE: "
								// + numeroReplicheLotti);
								cc.createNewAgent("Analisi",
										"agenti.analisi.AgenteTempiSoggiorno",
										par).start();
							} catch (StaleProxyException e1) {
								e1.printStackTrace();
							}
							AnalisiStatistica.this.dispose();
						}
					}
				}
			}
		});

		AnalisiStatistica.this.add(centerPane, BorderLayout.CENTER);
	}

	private void initSouthPanel() {
		JLabel campioni = new JLabel("Numero osservazioni");
		nCampioni = new JFormattedTextField(new RegexFormatter("[0123456789]*"));
		nCampioni.setColumns(4);

		JPanel datiAnalisi = new JPanel(new GridBagLayout());

		JLabel transitorio = new JLabel("Transitorio");
		transitorioTx = new JFormattedTextField(new RegexFormatter(
				"[0123456789]*"));
		transitorioTx.setColumns(4);

		JLabel passo = new JLabel("Passo");
		passoTx = new JFormattedTextField(new RegexFormatter("[0123456789]*"));
		passoTx.setColumns(4);

		JLabel lotti = new JLabel("Repliche/Lotti");
		lottiTx = new JFormattedTextField(new RegexFormatter("[0123456789]*"));
		lottiTx.setColumns(4);

		datiAnalisi.add(campioni, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0,
				GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(
						10, 10, 5, 2), 0, 0));

		datiAnalisi.add(nCampioni, new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0,
				GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(
						10, 10, 5, 2), 0, 0));

		datiAnalisi.add(transitorio, new GridBagConstraints(0, 1, 1, 1, 1.0,
				1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
				new Insets(10, 10, 5, 2), 0, 0));

		datiAnalisi.add(transitorioTx, new GridBagConstraints(1, 1, 1, 1, 1.0,
				1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
				new Insets(10, 10, 5, 2), 0, 0));

		datiAnalisi.add(passo, new GridBagConstraints(3, 0, 1, 1, 1.0, 1.0,
				GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(
						10, 10, 5, 2), 0, 0));

		datiAnalisi.add(passoTx, new GridBagConstraints(4, 0, 1, 1, 1.0, 1.0,
				GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(
						10, 10, 5, 2), 0, 0));

		datiAnalisi.add(lotti, new GridBagConstraints(3, 1, 1, 1, 1.0, 1.0,
				GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(
						10, 10, 5, 2), 0, 0));

		datiAnalisi.add(lottiTx, new GridBagConstraints(4, 1, 1, 1, 1.0, 1.0,
				GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(
						10, 10, 5, 2), 0, 0));

		Box boxDati = Box.createHorizontalBox();
		boxDati.add(datiAnalisi);
		boxDati.setBorder(BorderFactory.createTitledBorder("Parametri Analisi"));

		southPane.add(boxDati, new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0,
				GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(
						10, 10, 5, 2), 0, 0));

		southPane.add(ok, new GridBagConstraints(1, 1, 1, 1, 1.0, 1.0,
				GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(
						10, 10, 5, 2), 0, 0));

		AnalisiStatistica.this.add(southPane, BorderLayout.SOUTH);

	}

}
